Contemporary computing systems are equipped with significant amounts of random access memory, or RAM, presently on the order of 256 megabytes to a couple of gigabytes. However, current memory management mechanisms and methods were designed many years ago, when RAM was a relatively scarce computing resource. To provide large amounts of virtual memory to program processes, such memory management mechanisms relied on techniques such as on demand paging, essentially transferring pages of data from RAM to a disk drive when some quantity of RAM space was needed by another process, and, if that transferred data was ever again needed by its corresponding process, reading the data back from disk to RAM.
With such conventional memory management, needed pages are often absent from memory, even though the total amount of code and data that is referenced in typical usage patterns is fairly consistent over time and is small relative to current memory sizes. This is primarily a result of two factors, namely that the system undergoes transitions that can force needed pages from memory and/or quickly change the set of pages needed, and erosion, in which pages not in active use are overwritten with other data.
Examples of such transitions include booting from a powered-off state, switching from one user to another, resuming from a standby or hibernate mode, using a memory-hungry application (e.g., playing a game) and then proceeding back to typical system use, and returning to the computer after a long delay. Needless to say, in addition to fast normal operation, customers highly desire fast system and program startup following such transitions. However, with current memory management this is not presently possible. For example, tests have shown that following a resume from hibernate, an application launch can take as long as nine to eleven seconds, even though large amounts of memory are unused at this time. This is because most of the launch time is consumed in disk transfers, with the CPU blocked, waiting for the necessary code and data pages to be read from the disk, which as a result of demand paging is essentially performed one page at a time. In short, after such transitions, the set of pages of highest utility are often not in memory, leading to demand paging which provides a poor user experience because of slow input/output (I/O) transfer times.
Although some transitions involve the deliberate eviction of pages from memory, and others result in sudden demand for memory, still others result in pages falling inactive and being swapped to disk. More particularly, memory pages that are in working sets may be trimmed and placed into a cache of pages that are not in use, referred to herein as a standby page set (e.g., a standby list in a Windows®-based system), along with the pages of files that are closed. To reduce the number of disk reads and writes, memory management tracks which pages of memory in the standby page set were least recently accessed, and when memory is needed, selects those pages for transferring to disk, essentially in a first-in, first-out (FIFO) type of queue.
Although this technique works to an extent in reducing disk transfers, because it results in the pages most recently used by processes being those that remain in memory, modern applications have large code and data requirements. As a result, in the short term, pages generally can be recalled from this standby page set, however over a longer term, with conventional memory management, the standby page set's simple FIFO queuing results in erosion, in which possibly valuable (but not recently used) pages are overwritten with less valuable (but more recently used) pages. Consequently, a significant number of I/O transfers to and from the disk are necessary. Even on powerful systems these I/O transfers act as a bottleneck, whereby the system underutilizes the large amounts of available memory, leaving the CPU idle for large amounts of time.
In sum, contemporary programs require large amounts of random access memory and fast processing capabilities, which contemporary computing devices offer. However, current memory management technology does not adequately match these resources together, because current memory management was developed at a time when memory was scarce, and was thus designed with the general view that substantial disk usage was inevitable, yet not that burdensome because applications were small and multitasking was rare. As such, conventional memory management does not attempt to limit disk usage, beyond keeping the most-recently accessed pages in memory. In contemporary computing, this results in a significant amount of disk usage, thereby providing a bottleneck that hurts both actual and perceived performance.